Technical Note TN2062

Guide to Creating Kiosks on Mac OS X

 目次

ある種のマーケットで開発に携わるデベロッパは、アプリケーションに Kiosk 機能を追加する必要があります。つまり、ユーザを特定のアプリケーションに固定させたり、オペレーティングシステムで通常は使用できる特定の機能を無効にしたりできる機能です。

このテクニカルノートでは、Kiosk を作成したり、Kiosk のような動作をアプリケーションに組み込むテクニックをいくつか紹介します。Kiosk の開発をサポートするいくつかの重要な API が導入されていることから、このテクニカルノートでは Mac OS X 10.2 以降に焦点を当てます。それぞれのテクニックにどのシステムバージョンが必要であるかも説明します。

[2003 年 2 月 24 日]



重要:
このテクニカルノートで説明するテクニックは、Kiosk の動作を必要とする垂直マーケットで開発を行うデベロッパのみを対象としています。通常の Mac OS X ユーザの一般マーケットをターゲットとするデベロッパは、これらのテクニックを使用しないでください。



はじめに

垂直マーケット(教育分野など)で開発を行うデベロッパは、長い間、Kiosk の作成やアプリケーションへの Kiosk 動作の追加に取り組んできました。具体的には、ユーザを特定のアプリケーションに固定させたり、通常はオペレーティングシステムで使用できるある種の機能を無効にできるようにすることです。コンピュータシステムで Kiosk の動作を必要とするデベロッパは、多くの場合、長期的に維持するのが非常に困難な、「応急措置」的なソリューションを使用せざるを得ませんでした。それが Mac OS X 10.2 の登場によって、Kiosk の作成や既存アプリケーションへの Kiosk 機能の追加を、ごく間単に実装、サポートできるようになりました。

このテクニカルノートでは、Kiosk の開発に必要なテクニックを扱うだけでなく、Kiosk ソリューションのデベロッパからの一般的な質問とその回答も紹介します。



SystemUIMode API の機能

Mac OS X 10.2 では、SetSystemUIModeGetSystemUIMode という、2 つの重要な Kiosk 関連の API がシステムに追加されています。SystemUIMode API 全体としてはは、次のような機能を提供します。

  • Dock の表示/非表示動作の制御

  • メニューバーの表示/非表示動作の制御

  • アクティブにするアップルメニュー要素の制御

  • Command-Tab と Command-Shift-Tab キーによるプロセスの切り替えを無効にする

  • Command-Option-Escape キーまたはアップルメニューを通じ開く「強制終了」ウインドウを無効にする

  • Power ボタンが押されたときに表示される PowerKey ウインドウを無効にする

Mac OS X 10.2 と SystemUIMode API が登場する前は、上記の動作の大部分は、Mac OS X では実現できないか、できたとしても非常に困難でした。

SetSystemUIMode API により、呼び出し側アプリケーションのユーザインタフェースモードと、そのモードで有効にしたい特定の機能に関するオプションを指定できるようになりました。関数プロトタイプは、下記だけでなく HIToolbox フレームワーク内の MacApplication.h にもリストされています。



OSStatus SetSystemUIMode(
            SystemUIMode inMode,
            SystemUIOptions inOptions);


SetSystemUIMode を使用して Mac OS X システムの機能を制御または無効にする場合、要求された動作が有効になるのは、SetSystemUIMode を呼び出したプロセスが最前面に表示されている間だけです。つまり、SetSystemUIMode を呼び出した後、別のアプリケーションが最前面になると、要求されたユーザインタフェースモードは、もはや有効ではなくなります。また、SetSystemUIMode を呼び出したアプリケーションが後で再び最前面になると、以前に確立したユーザインタフェースモードが再び有効になります。



使用可能なユーザインタフェースモード

次の表は、inMode パラメータとして SetSystemUIMode に渡すユーザインタフェースモードの概要を示したものです。モードごとに、それがシステムで有効になっている場合の作用について解説します。

SystemUIMode

説明

kUIModeNormal

これは、Mac OS X のすべてのアプリケーションの通常またはデフォルトのモードです。このモードでは、すべての標準的なシステム UI 要素が有効で、表示可能になっています。

kUIModeContentSuppressed

このモードでは、画面のコンテンツ領域(メニューバー以外の領域)を覆うシステムユーザインタフェース要素が、非表示になります。ただし、マウスの動きや他のユーザの操作に反応して、これらの要素が自動的に表示されることがあります。例として、Dock はこのモードで非表示になりますが、マウスが Dock の自動表示領域に入ると、自動的に表示されます。

kUIModeContentHidden

このモードでは、画面のコンテンツ領域を覆うシステムユーザインタフェース要素が、非表示になります。kUIModeContentSuppressed とは異なり、このモードでは自動的に表示されるユーザインタフェース要素はありません。

kUIModeAllHidden

このモードでは、メニューバーを含む、すべてのシステムユーザインタフェース要素が非表示になります。このモードでは、システムユーザインタフェース要素は自動的に表示されません。



重要:
このテクニカルノートを公開した時点(Mac OS X 10.2.x)では、kUIModeContentHidden モードと kUIModeContentSuppressed モードは、Dock には認識されません。これは、Mac OS X の不具合(r. 2973242)が原因です。その結果として、kUIModeContentHidden モードと kUIModeContentSuppressed モードでは、Dock の動作は kUIModeNormalMode モードと同じになります。この問題は、Mac OS X の将来のリリースで修正される予定です。



使用可能なユーザインタフェースオプション

上記のユーザインタフェースモードとともに、デベロッパは SystemUIOptions も指定できます。SystemUIOptions を使うと、あるユーザインタフェースモードが有効なときに、そのモードの特定の機能を有効/無効にできます。次の表に、使用可能な SystemUIOptions をリストします。一部の SystemUIOptions は、表に示されている特定のユーザインタフェースモードに関してのみ有効です。定数は、inOptions 引数として SetSystemUIMode API に渡されます。前述のように、指定された SystemUIModeSystemUIOptions は、SetSystemUIMode を呼び出したプロセスが最前面に表示されている間のみ有効です

SystemUIOption

説明

有効な SystemUIModes

kUIOptionAutoShowMenuBar

通常はメニューバーによって占有されている画面領域に、ユーザがマウスを移動すると、メニューバーが自動的に表示されます。

kUIModeAllHidden

kUIOptionDisableAppleMenu

アップルメニューのすべての項目を無効にします。

すべてのユーザインタフェースモード。

kUIOptionDisableProcessSwitch

Command-Tab キーと Command-Shift-Tab キーによるプロセスの切り替えを無効にします。キーボード環境設定で選択されたウインドウ切り替えキーも無効になります。

kUIModeContentHiddenkUIModeContentSuppressedkUIModeAllHidden

kUIOptionDisableForceQuit

通常は Command-Option-Escape キーを通じて利用可能な「強制終了」ウインドウ、またはアップルメニューの「強制終了」メニュー項目を無効にします。

kUIModeContentHiddenkUIModeContentSuppressedkUIModeAllHidden

kUIOptionDisableSessionTerminate

Power キーが押されたときに表示される「Power キー」ウインドウを無効にします。アップルメニューの「再起動」、「システム終」、「ログアウト」メニュー項目も無効にします。

kUIModeContentHiddenkUIModeContentSuppressedkUIModeAllHidden



そのユーザインタフェースモードでは有効でないオプションを使おうとすると、渡されたオプションは無視されます。

複数の SystemUIOptions を同時に使用する場合は、SystemUIOptions 定数に対して、ビットごとの OR 演算を行うことができます。複数の SystemUIOptions を使用して SetSystemUIMode を呼び出す例を、次に示します。例では、Dock とメニューバーが非表示になります。また、「強制終了」ウインドウとともに、Command-Tab および Command-Shift-Tab キーボードショートカットキーが無効になります。



error = SetSystemUIMode(kUIModeAllHidden,
                  kUIOptionDisableAppleMenu
                  | kUIOptionDisableProcessSwitch
                  | kUIOptionDisableForceQuit);


上記のように、複数の SystemUIOptions を使用できますが、選択できる SystemUIMode1 つだけです。

SetSystemUIMode API の機能を示したデモアプリケーションを、UsingSystemUIMode からダウンロードできます。このデモアプリケーションのスクリーンショットを次に示します。さまざまな SystemUIModesSystemUIOptions を選択して、システムにどのように作用するかを調べてみてください。ただし、このアプリケーションは Mac OS X 10.2 以降でのみ動作します。



デモアプリケーションのスクリーンショット

図 1 デモアプリケーションのスクリーンショット



SetSystemUIMode 使って、システムのさまざまな動作を無効にできます。Kiosk デベロッパは、SystemUIModesSystemUIOptions の組み合わせによって、要件に合った構成に仕立てることができます。

先頭に戻る



Finder の置き換え

Mac OS X 10.0.x から、ログイン時のメインシステムアプリケーションとして、Finder 以外のプログラムを起動する機能がサポートされています。この機能により、Kiosk デベロッパは Finder アプリケーションを別のアプリケーションに置き換えることができます。たとえば、ログイン時に Finder の代わりに Kiosk アプリケーションをメインシステムアプリケーションとして起動できます。Finder アプリケーションとして起動するアプリケーションには、そのアプリケーションが予期しないエラーで終了(0 以外のエラーコードで終了)した場合も、自動的に再起動するという追加の利点もあります。Finder の置き換えに使うテクニックの詳細は、Inside Mac OS X: System OverviewReplacing the Finder のセクションで解説されています。

「System Overview」で説明されているテクニックを使って、systemdefaults コマンドラインツールの順に呼び出すことで、インストーラはプログラミングによって Finder を置き換えることができます。system 呼び出しの詳細は、Terminal で 「man system」と入力すると表示されます。Finder 設定を1 回だけ行えば、再起動後もシステムの環境設定は保持されます。

ログインしたユーザの下で defaults が呼び出された場合、インストーラは各ユーザの Finder 設定を置き換えます。これに対して、root として defaults が呼び出された場合は、すべてのユーザに関する Finder 設定が設定されます。両方が設定されている場合は、全ユーザの設定よりも、個人の Finder 設定が優先されます。

先頭に戻る



Open Firmware パスワードの有効化

Open Firmware パスワードは、新しい Macintosh システムで使用できるセキュリティ機能です。Open Firmware パスワードを有効にすると、コンピュータはセキュリティ保護された起動シーケンスを実行します。具体的には、Open Firmware パスワードを有効にすると、起動ディスクとして選択された(システム環境設定の「起動ディスク」パネルで選択された)ボリューム以外からは、コンピュータを起動できなくなります。また、Open Firmware パスワードを有効にすると、起動時に Command-S キーを同時に押しても、シングルユーザモードでは起動できなくなります。

現時点では、Open Firmware パスワードの設定をプログラムで行う公開されたソリューションはありません(r. 3075615)。このことは、この設定はインストーラでのみ設定可能であることを意味します。ただし、管理者は次の場所にある "Open Firmware Password" アプリケーションを使用して、Open Firmware パスワードを有効にすることができます。http://www.apple.com/downloads/macosx/apple/openfirmwarepassword.html



重要:
ユーザがマシンの物理的なメモリ量を変更して再起動すると、Open Firmware パスワードはリセットされます。Open Firmware パスワードレベルのセキュリティを必要とするシステムは、コンピュータ内部に物理的にアクセスするユーザから保護される必要があります。



先頭に戻る



Kiosk に関する上位 20 の質問



1) 強制終了を無効にするにはどうしたらよいですか?

kUIOptionDisableForceQuit SystemUIOption を設定して、SetSystemUIMode 呼び出します。このテクニックは、このテクニカルノートの「SystemUIMode」のセクションで詳しく説明されています。次のコードにもこれを示します。



error = SetSystemUIMode(
               kUIModeContentHidden,
               kUIOptionDisableForceQuit);



SetSystemUIMode を使って強制終了を無効にする方法では、呼び出し側のアプリケーションが最前面に表示されている場合にのみ、強制終了が無効になります。また、強制終了を完全に無効にするもう 1 つの方法もあります。「アプリケーションが強制終了されないようにするにはどうしたらよいですか?」で説明されているテクニックを使用すると、そのアプリケーションは「強制終了」ウインドウに表示されなくなります。



2) Dock を無効/起動不可にするにはどうしたらよいですか?

SetSystemUIMode API を使用すると、Dock を無効/起動不可にできます。特定のユーザインタフェースモードを選択すると、デベロッパは Dock をどのように無効にするかを正確にコントロールできます。詳細については、このテクニカルノートの「SystemUIMode」のセクションを参照してください。次のコードを使って、メニューバーはそのまま表示し、Dock だけを完全に起動不可にできます。



error = SetSystemUIMode(kUIModeAllHidden, NULL); 
ShowMenuBar();  //メニューバーを表示する



このテクニックを使用して Dock を無効にする方法では、呼び出し側のアプリケーションが最前面に表示されている間だけ、Dock が無効になります。



3) Command-Tab または Command-Shift-Tab のプロセス切り替えキー無効にするにはどうしたらよいですか?

kUIOptionDisableProcessSwitch SystemUIOption を設定して SetSystemUIMode を呼び出すと、これらのキーを無効にできます。このテクニックは、このテクニカルノートの「SystemUIMode」のセクションで詳しく説明されています。次のコードにもこれを示します。



error = SetSystemUIMode(
               kUIModeContentHidden,
               kUIOptionDisableProcessSwitch);



SetSystemUIMode を使ってプロセス切り替えキーを無効にする方法では、呼び出し側のアプリケーションが最前面に表示されている間だけ、このキーが無効になります。



4)アップルメニュー(またはその一部)を無効にするにはどうしたらよいですか?

kUIOptionDisableAppleMenu SystemUIOption を設定して SetSystemUIMode を呼び出すと、アップルメニュー全体を無効にできます。このテクニックは、このテクニカルノートの「SystemUIMode」のセクションで詳しく説明されています。このテクニックを使用してアップルメニューを無効にする方法では、呼び出し側のアプリケーションが最前面に表示されている間だけ、アップルメニューが無効になります。次のコードでもこれを示します。



error = SetSystemUIMode(kUIModeAllHidden,
                  kUIOptionDisableAppleMenu
                  | kUIOptionDisableProcessSwitch
                  | kUIOptionDisableForceQuit);


上記のテクニックで、アップルメニュー全体が無効になります。アップルメニューの特定の部分を無効にする方法については、このテクニカルノートの「SystemUIMode」のセクションを参照してください。



5) アプリケーションが強制終了されないようにするにはどうしたらよいですか?

セクション「強制終了を無効にするにはどうしたらよいですか?」で説明されているテクニックを使って、強制終了を完全に無効にできます。これにより、呼び出し側のアプリケーションが最前面に表示されている限り、「強制終了」ウインドウは開きません。ユーザが、How to Create a Full-Screen Context で説明されている CGDisplayCapture API を使用して表示画面をキャプチャしていない場合では、利用可能なもう 1 つのやり方があります。この方法では、アプリケーションは「強制終了」メニューには表示されません。そのため、ユーザが「強制終了」メニューを呼び出しても、そのアプリケーションはリストに表示されません。これを実現するには、アプリケーションの Info.plist に LSUIElement キーを追加します。この方法を有効にするのに必要な正確な設定は、LSUIElement = 1(文字列)で、下の PropertyListEditor のスクリーンショットで示されています。



強制終了に表示させないための Info.plist

図 2 アプリケーションを「強制終了」メニューに表示しないための Info.plist



重要:
Info.plist で LSUIElement プロパティを使用しているアプリケーションでは、SetSystemUIMode API を使用しないでください。また、LSUIElement プロパティを設定すると、アプリケーションが Dock で表示されなくなります。



6) シングルユーザモード(起動時の Command-S)を無効にするにはどうしたらよいですか?

シングルユーザモードを無効にする最も効果的な方法は、システムの Open Firmware パスワードを無効にする方法です。これには、このテクニカルノートの 「Open Firmware パスワードの有効化」のセクションで説明されているテクニックを使います。



7) Eject キーを無効にするにはどうしたらよいですか?

現在、Eject キーを無効にする方法はサポートされていません。ただし、新しく挿入されたメディアがマウントされないようにすることは可能です。詳細については、セクション「新しいメディア(CD、DVD、iPod、USB/Firewire ハードディスクなど)のマウントを防ぐにはどうしたらよいですか?」を参照してください。



8) ユーザが別のメディア(ブータブル CD や外付けハードディスクなど)から起動するのを防ぐにはどうしたらよいですか?

システムの Open Firmware パスワードを有効にすると、他のシステムディスクからの起動を防止できます。これには、このテクニカルノートの 「Open Firmware パスワードの有効化」のセクションで説明されているテクニックを使用します。



9) 新しいメディア(CD、DVD、iPod、USB/Firewire ハードディスクなど)のマウントを防ぐにはどうしたらよいですか?

現時点では、この問題(r. 2824118)をプログラムで解決するための、公開されている方法はありません。現時点では、http://www.info.apple.com/usen/mm/ にある Macintosh Manager アプリケーションを使うと、管理者は新しいメディアのアクティブ化を無効にできます。



10) Command-Control-Power(強制再起動)を無効にするにはどうしたらよいですか?

現在、このキーを無効にする方法はサポートされていません。また、「Command-Control-Eject(通常の再起動)を無効にするにはどうしたらよいですか?」で説明されている通常の再起動を防止するテクニックも、強制再起動の防止には役立ちません。ただし、「ユーザが別のメディアからブートするのを防ぐにはどうしたらよいですか?」および「シングルユーザモードを無効にするにはどうしたらよいですか?」で説明されているテクニックを使用すると、起動中にコンピュータのセキュリティ保護を行うことができます。



11) アプリケーションが画面全体を覆うように、フルスクリーンにするにはどうしたらよいですか?

一般的に使用されるテクニックとしては、OpenGL のドキュメントの How to Create a Full-Screen Context で説明されている、CGDisplay Capture ルーチンを使用する方法があります。それよりも簡単な解決策として、Kiosk アプリケーションの GUI のメインウインドウを、画面をすべて使うように編集する方法があります。この方法では、オペレーティングシステムの他の要素が無効になっている限り、アプリケーションは最前面で表示され続けます。注:ウインドウを移動可能にしたい場合は、「ユーザがデスクトップをクリックしてアプリケーションの外へ切り替えるのを防ぐにはどうしたらよいですか?」で説明されているテクニックを使用して、デスクトップへの切り替えを無効にする必要がある場合があります。



12) ユーザがデスクトップをクリックしてアプリケーションの外へ切り替えるのを防ぐにはどうしたらよいですか?

1 つのテクニックとしては、ユーザのデスクトップへのアクセスを完全に禁止する方法があります。これは、フルスクリーンアプリケーションを作成することで実現できます。フルスクリーンアプリケーションを作成するテクニックは、「アプリケーションが画面全体を覆うように、フルスクリーンにするにはどうしたらよいですか?」で説明されています。

「デスクトップへの切り替え」を無効にする必要がある場合は、Finder を無効にすると実現できます。これは、デスクトップに表示されるすべてのハードディスクと連携して、「デスクトップへの切り替え」サービスを Finder が提供しているためです。Finder を無効にする 1 つのテクニックとして、このテクニカルノートの「Finder の置き換え」のセクションで説明されているテクニックを使用して、Finder を置き換える方法があります。Finder を無効にするもう 1 つの手法としては、Finder に kAEQuitApplication Apple イベントを送信する方法があります。次のコードは、Apple イベントを使用して Finder を終了する方法を示しています。



リスト 2 Apple イベントを使用してプログラムにより Finder を終了する

OSErr QuitFinder()
{
    int kFinderProcessSignature = 'MACS';
    OSErr            anErr = paramErr;
    AppleEvent        tAppleEvent = {typeNull,nil};
    AppleEvent      tReply;
    AEBuildError    tAEBuildError;

    anErr = AEBuildAppleEvent(
                kCoreEventClass, kAEQuitApplication,
                typeApplSignature, &kFinderProcessSignature,
                sizeof(OSType), kAutoGenerateReturnID,
                kAnyTransactionID, &tAppleEvent,
                &tAEBuildError,"");

    if (noErr == anErr)
    {
        anErr = AESend( &tAppleEvent, &tReply, kAENoReply |
                          kAENeverInteract, kAENormalPriority,
                          kNoTimeOut, nil, nil );

        (void) AEDisposeDesc(&tAppleEvent);
    }
    return anErr;
}

int main(int argc, char *argv[])
{
    OSErr error = QuitFinder();
    
    if (error != noErr)
        {printf("Finder quit successfully!¥n");}
    else
        {printf("Finder wouldn't quit!¥n");}

    return 0;
}


上記のコードは、ダウンロード可能な QuitFinder のサンプルからも利用可能です。



13) Command-H(隠す)および Command-Q(終了)を無効にするにはどうしたらよいですか?

これらのキーは、Mac OS X の経験が浅い Kiosk デベロッパには、問題になることがあります。これらのキーを無効にする方法は、デベロッパが Carbon と Cocoa のどちらを使用しているかによって異なります。これらのキーを無効にする方法の完全な説明は、下記の表に示してあります。

Carbon で動作を無効にする
Carbon でキー無効にする 1 つの方法として、このキーを可能にしているメニュー項目を削除する方法があります。「終了」と「隠す」のメニュー項目を完全に削除すると、これに相当するキーは無効になります。これらのメニュー項目の削除をプログラムで行うには、まず kHICommandHide または kHICommandQuitinCommandID 引数として渡して GetIndMenuItemWithCommandID を使い、メニュー項目の場所を確認します。場所を確認したら、DeleteMenuItem を呼び出してメニュー項目を削除できます。メニュー項目を完全に無効にする代替手段としては、メニュー項目を保持しながら、キーだけを無効にする方法があります。これには、GetIndMenuItemWithCommandID を使用して適切なメニュー項目の位置を確認したら、cmdChar 引数に 0 を渡す SetItemCmd を呼び出します。次のコードでは、両方のテクニックが示してあります。



//「終了」メニュー項目の完全な削除
error = GetIndMenuItemWithCommandID(
                   NULL, kHICommandQuit, 1,
                   &applicationMenu, &outIndex);
DeleteMenuItem(applicationMenu, outIndex);

//「隠す」メニューの Command-H キーの無効化
error = GetIndMenuItemWithCommandID(
                   NULL, kHICommandHide, 1,
                   &applicationMenu, &outIndex);
SetItemCmd(applicationMenu, outIndex,0);


Cocoa で動作を無効にする
Cocoa では、プログラムの nib ファイルを編集するだけで、「終了」および「隠す」メニュー項目から Command-Q および Command-H キーの割り当てを削除できます。使用できる別の代替手段としては、単にプログラムから「終了」および「隠す」のメニュー項目を削除する方法があります。

Carbon と Cocoa の両方で使用できるもう 1 つのテクニックとしては、Command-H キーに別のメニュー項目を割り当てる方法があります。プログラムで、Command-H キーに別のメニュー項目が設定してあれば、Command-H のデフォルトであるアプリケーションを隠す動作よりも、そのメニュー項目が優先されます。これは、Command-H(隠す)でのみ正しく動作し、Command-Q(終了)では正しく動作しません。



14) Power キーや Control-Eject キーが押されたときにポップアップ表示されるウインドウを無効にするにはどうしたらよいですか?

これには、kUIOptionDisableSessionTerminate SystemUIOption を設定して、SetSystemUIMode 呼び出しを使用します。このテクニックは、このテクニカルノートの「SystemUIMode」のセクションで詳しく説明されています。次のコードにもこれを示します。



error = SetSystemUIMode(kUIModeContentHidden,
                      kUIOptionDisableSessionTerminate);



SetSystemUIMode を使用して Power キーウインドウを無効にする方法では、呼び出し側のアプリケーションが最前面に表示されている間だけ、このキーが無効になります。



15) Command-Option-Eject(スリープ)を無効にするにはどうしたらよいですか?

I/O Kit API を使用すると、Kiosk デベロッパはシステムスリープを無効にできます。これには、システムスリープに関するパワー変更の通知を受け取った後で、IOCancelPowerChange を呼び出します。このテクニックは、I/O Kit ドキュメントの Receiving Notification of Power Events で詳細に説明されています。このテクニックは、ラップトップコンピュータのふたを閉じた場合などの、"demand power change" の状況では正しく動作しません。



16) Command-Control-Option-Eject(通常のシステム終了)を無効にするにはどうしたらよいですか?

現在、このキーを無効にする方法はサポートされていません。ただし、userCanceledErrkAEQuitApplication Apple イベントに返すことで、再起動を防ぐことができます。このテクニックは、「Command-Control-Eject(通常の再起動)を無効にするにはどうしたらよいですか?」で説明されています。



17) Command-Control-Eject(通常の再起動)を無効にするにはどうしたらよいですか?

現在、このキーを無効にする方法はサポートされていません。ただし、kAEQuitApplication Apple イベントを登録し、そのイベントに userCanceledErr を返すことで、再起動を防ぐことができます。このテクニックは、ダウンロード可能な PreventLogoutRestartShutdown と、次のコードに示してあります。



リスト 3 プログラムによりログアウト/再起動/システム終了を防止する。

OSErr QuitAppleEventHandler( const AppleEvent *appleEvt, 
                AppleEvent* reply, UInt32 refcon )
{
    //userCanceledErr を返してログアウトをキャンセルする
    return userCanceledErr;
}

int main(int argc, char *argv[])
{
    OSErr   err;

    //終了イベントハンドらのインストール
    err = AEInstallEventHandler( kCoreEventClass, 
          kAEQuitApplication,  NewAEEventHandlerUPP(
          (AEEventHandlerProcPtr)QuitAppleEventHandler),  
          0, false );
    
    if (err != noErr)
        ExitToShell();

    EventLoop(); 

    return 0;
}


このテクニックを使用してログアウト/再起動/シャットダウンを無効にした場合、ユーザには、アプリケーションが操作をキャンセルしたことを通知するダイアログが表示されます。このテクニックは、「System Overview」の Terminating Processes でも説明されています。



18) Command-Shift-3 および Command-Shift-4 のスクリーンキャプチャキーを無効にするにはどうしたらよいですか?

現在、これらのキー割り当てを無効にする方法はサポートされていません。(r. 3085384)



19) 一部のキーボードで使用できるビデオブライトネスキーを無効にするにはどうしたらよいですか?

現在、これらのキーを無効にする方法はサポートされていません。



20) 一部のキーボードで使用できるサウンドボリュームキーを無効にするにはどうしたらよいですか?

現在、これらのキーを無効にする方法はサポートされていません。

先頭に戻る



要約

従来は、Kiosk の作成や、アプリケーションへの Kiosk スタイルの動作の追加は、極めて困難でした。しかし、Mac OS X で利用できるようになった新機能により、このプロセスは大幅に簡単になりました。最後に、このテクニカルノートの上記のセクションで取り上げられていない(または現在でサポートされていない)動作が Kiosk で必要な場合は、dts@apple.com まで電子メールでご連絡ください。

先頭に戻る



参考文献

Mac OS X System Overview では、Mac OS X の高度な概要が説明されています。Mac OS X で開発を始める際の出発地点として適しています。

QA 1123: Getting List of All Processes on Mac OS X には、BSD プロセスリストの「スナップショット」の入手法に関する情報があります。

TN 2050: Observing Process Lifetimes Without Polling には、プロセスの起動/終了時の通知の取得に関する情報とコードがあります。



先頭に戻る



ダウンロード

Acrobat gif

このテクニカルノートの PDF 版(500K)

ダウンロード

Folder gif

SetSystemUIMode API のデモアプリケーション(56K)

ダウンロード

Folder gif

Finder を終了するサンプルデモ(8K)

ダウンロード

Folder gif

プログラムによりログアウトを防止する方法を示すサンプル(8K)

ダウンロード



先頭に戻る